/*
 * C/C++ KLIB Project
 * 
 * Copyright (c) 2012 Ken Zhang (cpp.china@gmail.com)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this program; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
 * Boston, MA  02111-1307  USA
 *
 */

#include <windows.h>
#include <stdio.h>
#include "klib.h"

int _setforecolor(enum color_e forecolor)
{
	HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	GetConsoleScreenBufferInfo(hStdout, &csbi);
	SetConsoleTextAttribute(hStdout, csbi.wAttributes & 0xF0 | forecolor);
	return (csbi.wAttributes & 0x0F);
}

int _setbackcolor(enum color_e backcolor)
{
	HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	GetConsoleScreenBufferInfo(hStdout, &csbi);
	SetConsoleTextAttribute(hStdout, csbi.wAttributes & 0x0F | backcolor);
	return (csbi.wAttributes & 0xF0) >> 4;
}

int _getforecolor()
{
	HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	GetConsoleScreenBufferInfo(hStdout, &csbi);
	return (csbi.wAttributes & 0x0F);
}

int _getbackcolor()
{
	HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	GetConsoleScreenBufferInfo(hStdout, &csbi);
	return (csbi.wAttributes & 0xF0) >> 4;
}

int termcolor(int type, int c)
{
	switch (type) {
		case FORE_COLOR:
			if (c == -1)
				return _getforecolor(c);
			else
				return _setforecolor(c);
		case BACK_COLOR:
			if (c == -1)
				return _getbackcolor(c);
			else
				return _setbackcolor(c);
		default:
			return -1;
	}
}

int cprint(int color, const char *str)
{
	int origin = _setforecolor(color);
	int n = fputs(str, stdout);
	_setforecolor(origin);
	return n;
}

int cprintln(int color, const char *str)
{
	int origin = _setforecolor(color);
	int n = puts(str);
	_setforecolor(origin);
	return n;
}
